//
//  XTHomeViewController.swift
//  MyBlog
//
//  Created by victor on 16/11/10.
//  Copyright © 2016年 victor. All rights reserved.
//

import UIKit

// 定义全局常量，尽量使用filePrivate修饰，否则到处都可以访问
/// 原创微博可重用 cell id
fileprivate let originalCellId = "originalCellId"
/// 被转发微博的可重用 cell id
fileprivate let retweetedCellId = "retweetedCellId"

class XTHomeViewController: XTBaseViewController {
    
    /// 列表视图模型
    fileprivate lazy var listViewModel = XTStatusListViewModel()
        
    /// 加载数据
    override func loadData() {
        
        // Xcode 8.0 的刷新控件，beginRefreshing 方法，什么都不显示！
        refreshControl.beginRefreshing()
        
        print("准备刷新，最后一条 \(self.listViewModel.statusList.last?.status.text)")
        // 模拟演示加载数据
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
            self.listViewModel.loadStatus(pullUp: self.isPullup) { (isSuccess,shouldRefresh) in
                
                print("加载数据结束")
                // 结束刷新控件
                self.refreshControl.endRefreshing()
                
                // 恢复上拉刷新标记
                self.isPullup = false
                
                // 刷新表格
                if shouldRefresh {
                    self.tableView?.reloadData()
                }
            }
        }
    }
    
    /// 显示好友
    @objc fileprivate func showFriends() {
        let vc = XTDemoViewController()
        
        // 这种隐藏底部tabbar的方法十分容易忘记，不推荐
//        vc.hidesBottomBarWhenPushed = true
        
        navigationController?.pushViewController(vc, animated: true)
    }

}

//MARK: -表格数据源方法，具体的数据源方法实现，不需要super
extension XTHomeViewController {
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return listViewModel.statusList.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        // 取出视图模型，根据视图模型判断可重用cell
        let viewModel = listViewModel.statusList[indexPath.row]
        
        if viewModel.status.retweeted_status != nil {
            
            // 本身会调用代理方法(如果有) / 如果没有， 找到cell 按照自动布局的规则，从上向下计算，找到向下的约束，从而计算动态行高
            let cell = tableView.dequeueReusableCell(withIdentifier: retweetedCellId, for: indexPath) as! XTRetweetStatusCell
            
            cell.viewModel = viewModel
            
            return cell
        } else {
            let cell = tableView.dequeueReusableCell(withIdentifier: originalCellId, for: indexPath) as! XTStatusCell
            
            cell.viewModel = viewModel
            
            return cell
        }
    }
    
    // swift3.0里没有 override 父类没有提供这个方法 这个方法不会被调用
    // 去baseContrller 实现一下这个方法，然后在子类里override 就可以了
    /// 父类必须实现代理，子类才能重写,swift3.0才是如此，2.0不需要
    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        
        // 根据indexPath 获取视图模型
        let viewModel = listViewModel.statusList[indexPath.row]
        
        // 返回计算好的行高
        return viewModel.rowHeight
    }
}

//MARK: -设置界面
extension XTHomeViewController {
    
    override func setupTableView() {

        super.setupTableView()
        
        // 取消自动行高
        //tableView?.rowHeight = UITableViewAutomaticDimension
        // 预估行高
        tableView?.estimatedRowHeight = 300
        
        // 设置导航栏按钮
        navItem.leftBarButtonItem = UIBarButtonItem(title: "好友", fontSize: 16, target: self, action: #selector(showFriends))
        
        // 注册原型cell
        tableView?.register(XTStatusCell.self, forCellReuseIdentifier: originalCellId)
        tableView?.register(XTRetweetStatusCell.self, forCellReuseIdentifier: retweetedCellId)
        
        // 取消分割线
        tableView?.separatorStyle = .none
        
        setupNavTitle()
    }
    
    /// 设置导航栏标题
    fileprivate func setupNavTitle() {
        let title = XTNetWorkManger.shared.userAccount.screen_name
        
        let button = XTTitleButton(title: title)
        
        navItem.titleView = button
        
        button.addTarget(self, action: #selector(clickTitleButton), for: .touchUpInside)
    }
    
    @objc func clickTitleButton(btn: UIButton) {
        
        // 设置选中状态
        btn.isSelected = !btn.isSelected
    }
}
